package com.code.array;

public class tip {
    /**
     *
     * 明哥： hard题可以学暴力破，mid和ez的尽量掌握最优解
     *
     * 刷题技巧
     *   谨记： 数组不是单调的话，不要用滑动窗口，考虑用前缀和        单调含义： 往右一定递增，往左一定递减（或者反过来）。这样才能确定什么时候吃，什么时候吐
     *     前缀和的作用：快速计算子数组和    前缀和 默认第0个元素出现频率是0  例题求 和为 k 的子数组 ； 前缀和[i]-k=x； x在前缀和出现的次数相加既为答案
     *
     *数组长度是 .length   String长度是 .length()
     *
     *String类型截取 字符串 .substring()
     *
     *char ==Character   str.toCharArray() 转数组
     *
     *Integer.MAX_VALUE   Integer.MI_NVALUE  最大最小值
     *
     *
     * map常用方法   map.containsKey(key) 查看集合中是否有Key boolean类型
     *              map.get(Key)  根据Key获取value
     *              map.getOrDefault(key,defaultValue)  获取指定键对应的值，如果键不存在则返回默认值
     *              map.size()  统计map中有几个key值
     *
     *
     * 获取数组nums 中的最大值    Arrays.stream(nums).max().getAsInt();
     *
     * list转数组 list.toArray();
     *
     *
     * Deque 双端队列      Queue单端队列
     *
     *
     *比较两个数大小   Math.max(a,b);
     *
     * int[][] intervals 类型  可以使用  List<int []> list 去接收 最后   list.toArray(new int[0][])转为二维数组
     *
     *
     * 二维数组声明写法  int[][] dirs=new int [][]{{0,1},{1,0},{0,-1},{-1,0}};     全是尖括号 没有圆括号
     *
     *
     *
     * 复制数组 快捷方式
     int n=nums.length;
     int []result=new int[n];
     //arraycopy  有值的数组、起始位置、无值数组、目标起始位置、复制长度
     System.arraycopy(nums,0,result,0,n);
     *
     *
     *
     *  ([1,3],[2,6],[8,10]) intervals  取二维数组第一个序列的值 intervals[0][0];intervals[0][1];
     *
     *
     *
     * 二维数组比较写法   起始值不同时比较起始值,起始值相同时比较结束值  ([1,3],[2,6],[8,10])
     *
     *              Arrays.sort(intervals,(a,b) ->{
     *             //比较两个区间的起始值
     *             if(a[0]==b[0]){
     *                 //起始值相同，按照结束值升序排列
     *                return Integer.compare(a[1], b[1]);
     *             }else{
     *                 //起始值不同，按起始值排序
     *                  return Integer.compare(a[0], b[0]);
     *             }
     *
     *    下面是原始的写法
     * Arrays.sort(intervals, (a, b) -> {
     *     // 先比较起始值
     *     if (a[0] < b[0]) {
     *         return -1; // a应该排在b前面
     *     } else if (a[0] > b[0]) {
     *         return 1;  // a应该排在b后面
     *     } else {
     *         // 起始值相等，再比较结束值
     *         if (a[1] < b[1]) {
     *             return -1;
     *         } else if (a[1] > b[1]) {
     *             return 1;
     *         } else {
     *             return 0;
     *         }
     *     }
     * });
     * ```
     * 但是这样的写法比较冗长。
     *
     *
     *
     * 问：一般在做链表题时，什么时候要写 while node，什么时候要写 while node.next？
     *
     * 答：如果要遍历到最后一个节点，需要写 while node；如果要遍历到倒数第二个节点，需要写 while node.next
     *
     *
     *
     *
     */
}
